'Normal Distribution : 正态分布生成器
'Box_Muller方法
'Box_Muller方法的推导过程较为复杂。但得到的结果却是很令人满意的。只要用两个相互独立的均匀分布就能得到正态分布用Box_Muller方法，随机抽出两个从均[0,1]匀分布的数字u和v。
Function boxmullersamplingCos()
    Dim u#, v#, Pi#, Z#
    u = Rnd
    v = Rnd
    Pi = 3.141593
    Z = Sqr(-2 * WorksheetFunction.Ln(u)) * Cos(2 * Pi * v)
    boxmullersamplingCos = Z
End Function

Function boxmullersamplingSin()
    Dim u#, v#, Pi#, Z#
    u = Rnd
    v = Rnd
    Pi = 3.141593
    Z = Sqr(-2 * WorksheetFunction.Ln(u)) * Sin(2 * Pi * v)
    boxmullersamplingSin = Z
End Function

'Exponential Distribution : 指数分布生成器
'ITM算法思路
'根据给出的概率密度函数f(X)（PDF）积分得到其累积分布函数F(X)（CDF）
'生成一个服从均匀分布的随机数S~U(0,1)
'根据累积分布函数Y=F(X)，求得其反函数X=F-1(Y)
'返回X=F-1(S)作为本次生成的随机数
Function expDistribution(λ As Double)
    'λ：指数分布的参数
    'src：用来生成均匀分布随机数U(0,1)
    Dim src#, Z#
    src = Rnd
    Z = WorksheetFunction.RoundDown(-1 / λ * Log(src), 0)
    expDistribution = Z
End Function

'Sub test()
'    Dim i%
'    Application.ScreenUpdating = False
'    For i = 1 To 10000
'        Cells(i, 1) = expDistribution(0.3)
'    Next i
'    Application.ScreenUpdating = True
'End Sub
